package juanca.mole;

import java.sql.Time;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.json.JSONObject;

import ClasesExtras.ManejadorCampos;
import ClasesExtras.handlerAlertMessage;
import android.os.Bundle;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.app.TimePickerDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.WindowManager;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.TimePicker;
import android.widget.Toast;

public class PhCloroLibre extends Activity {

	private int fAno;
	private int fMes;
	private int fDia;
	private int hMinuto;
	private int hHora;
	private int cloro;
	private int ph;
	private String idEmpleado;
	private String passwEmpleado;
	private String idOperarioEmpleado;
	private String observaciones;
	private boolean SALIR;

	private Date fechaUsuario;
	private Time tiempoUsuario;
	private Date fechaSistema;
	private Time tiempoSistema;

	public static final int DATE_DIALOG_ID = 0;
	public static final int TIME_DIALOG_ID = 1;
	public static final String STRING_EMPTY = "";
	private static final String URL_VALIDAR_USUARIO = "http://10.1.1.174:3000/validar.json";
	private static final String URL_REGISTROS_PH_CLORO = "http://10.1.1.174:3000/registros_ph_cloro.json";
	private static final String CNV = "cnv";
	private static final String PNV = "pnv";
	private static final String no_permiso = "no_permiso";
	private PhCloroLibre self = this;

	private EditText etCloroPhClLb;
	private EditText etPh;
	private EditText etIdPhClLb;
	private EditText etPasswPhClLb;
	private EditText etObsRegMP;
	private ManejadorCampos manejador;
	private handlerAlertMessage manejadorMensajes;
	private Activity activity;

	/**
	 * @return the observaciones
	 */
	public String getObservaciones() {
		return observaciones;
	}

	/**
	 * @param observaciones
	 *            the observaciones to set
	 */
	public void setObservaciones(String observaciones) {
		this.observaciones = observaciones;
	}

	/**
	 * @return the sALIR
	 */
	public boolean isSALIR() {
		return SALIR;
	}

	/**
	 * @param sALIR
	 *            the sALIR to set
	 */
	public void setSALIR(boolean sALIR) {
		SALIR = sALIR;
	}

	/**
	 * @return the idOperarioEmpleado
	 */
	public String getIdOperarioEmpleado() {
		return idOperarioEmpleado;
	}

	/**
	 * @param idOperarioEmpleado
	 *            the idOperarioEmpleado to set
	 */
	public void setIdOperarioEmpleado(String idOperarioEmpleado) {
		this.idOperarioEmpleado = idOperarioEmpleado;
		this.setSALIR(true);
	}

	public int getCloro() {
		return cloro;
	}

	public void setCloro(int cloro) {
		this.cloro = cloro;
		this.setSALIR(true);
	}

	public int getPh() {
		return ph;
	}

	public void setPh(int ph) {
		this.ph = ph;
		this.setSALIR(true);
	}

	public String getIdEmpleado() {
		return idEmpleado;
	}

	public void setIdEmpleado(String idEmpleado) {
		this.idEmpleado = idEmpleado;
		this.setSALIR(true);
	}

	public String getPasswEmpleado() {
		return passwEmpleado;
	}

	public void setPasswEmpleado(String passwEmpleado) {
		this.passwEmpleado = passwEmpleado;
		this.setSALIR(true);
	}

	public Date getFechaUsuario() {
		return fechaUsuario;
	}

	public void setFechaUsuario(Date fechaUsuario) {
		this.fechaUsuario = fechaUsuario;
		this.setSALIR(true);
	}

	public Time getTiempoUsuario() {
		return tiempoUsuario;
	}

	public void setTiempoUsuario(Time tiempoUsuario) {
		this.tiempoUsuario = tiempoUsuario;
		this.setSALIR(true);
	}

	public Date getFechaSistema() {
		return fechaSistema;
	}

	public void setFechaSistema(Date fechaSistema) {
		this.fechaSistema = fechaSistema;
	}

	public Time getTiempoSistema() {
		return tiempoSistema;
	}

	public void setTiempoSistema(Time tiempoSistema) {
		this.tiempoSistema = tiempoSistema;
	}

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.layout_ph_cloro_libre);

		getWindow().setSoftInputMode(
				WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

		etObsRegMP = (EditText) findViewById(R.id.etObsRegMP);
		etCloroPhClLb = (EditText) findViewById(R.id.etCloroPhClLb);
		etPh = (EditText) findViewById(R.id.etPh);
		etIdPhClLb = (EditText) findViewById(R.id.etIdPhClLb);
		etObsRegMP = (EditText) findViewById(R.id.etObsRegMP);
		etPasswPhClLb = (EditText) findViewById(R.id.etPasswPhClLb);
		manejadorMensajes = new handlerAlertMessage();
		manejador = new ManejadorCampos();
		activity = this;
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.layout_ph_cloro_libre, menu);
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		// Handle item selection
		switch (item.getItemId()) {
		case R.id.menu_settings:
			if (this.salir()) {

				new AlertDialog.Builder(this)
						.setIcon(android.R.drawable.ic_dialog_alert)
						.setTitle(R.string.tituloAlerta)
						.setMessage(R.string.msjPregunta)
						.setNegativeButton(R.string.btnNo, null)// sin listener
						.setPositiveButton(R.string.btnSi,
								new DialogInterface.OnClickListener() {// un
									// listener que al pulsar, cierre la
									// aplicacinn
									@Override
									public void onClick(DialogInterface dialog,
											int which) {
										// Salir
										Intent intent = new Intent();
										intent.setClass(activity, Etapas.class);
										startActivity(intent);
									}
								}).show();

				return true;

			} else {
				Intent intent = new Intent();
				intent.setClass(this, Etapas.class);
				startActivity(intent);
			}

		default:
			return super.onOptionsItemSelected(item);
		}
	}

	@SuppressWarnings("deprecation")
	public void FechaPhCloro(View v) {
		final Calendar c = Calendar.getInstance();
		fAno = c.get(Calendar.YEAR);
		fMes = c.get(Calendar.MONTH);
		fDia = c.get(Calendar.DAY_OF_MONTH);
		showDialog(DATE_DIALOG_ID);
	}

	@SuppressWarnings("deprecation")
	public void HoraPhCloro(View v) {
		final Calendar c = Calendar.getInstance();
		hHora = c.get(Calendar.HOUR_OF_DAY);
		hMinuto = c.get(Calendar.MINUTE);
		showDialog(TIME_DIALOG_ID);

	}

	@SuppressLint("SimpleDateFormat")
	private TimePickerDialog.OnTimeSetListener showtime = new TimePickerDialog.OnTimeSetListener() {

		@SuppressLint("SimpleDateFormat")
		@Override
		public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
			hHora = hourOfDay;
			hMinuto = minute;

			Context context = getApplicationContext();
			CharSequence text = new StringBuilder().append(hHora).append(":")
					.append(hMinuto);
			int duration = Toast.LENGTH_SHORT;

			Toast toast = Toast.makeText(context, text, duration);
			toast.show();

			SimpleDateFormat formatoTiempo = new SimpleDateFormat("hh:mm");
			String time = (hHora + ":" + hMinuto).toString();

			try {
				Time tiempo = new Time(formatoTiempo.parse(time).getTime());
				setTiempoUsuario(tiempo);

			} catch (java.text.ParseException e) {
				manejadorMensajes.alertMessageOneButton(activity,
						R.string.tituloError, R.string.msjERHoraUsuario,
						R.string.btnAceptar);

			}

		}
	};

	private DatePickerDialog.OnDateSetListener showdate = new DatePickerDialog.OnDateSetListener() {

		@SuppressLint("SimpleDateFormat")
		@Override
		public void onDateSet(DatePicker view, int year, int monthOfYear,
				int dayOfMonth) {
			fAno = year;
			fMes = monthOfYear + 1;
			fDia = dayOfMonth;

			Context context = getApplicationContext();
			CharSequence text = new StringBuilder().append(fDia).append("-")
					.append(fMes).append("-").append(fAno);
			int duration = Toast.LENGTH_SHORT;

			Toast toast = Toast.makeText(context, text, duration);
			toast.show();

			SimpleDateFormat formatoFecha = new SimpleDateFormat("dd-MM-yyyy");
			String date = (fDia + "-" + fMes + "-" + fAno + "-").toString();

			try {
				setFechaUsuario(formatoFecha.parse(date));

			} catch (java.text.ParseException e) {

				manejadorMensajes.alertMessageOneButton(activity,
						R.string.tituloError, R.string.msjERHoraUsuario,
						R.string.btnAceptar);

			}

		}
	};

	@Override
	protected Dialog onCreateDialog(int id) {
		switch (id) {
		case TIME_DIALOG_ID:
			return new TimePickerDialog(this, showtime, hHora, hMinuto, true);

		case DATE_DIALOG_ID:
			return new DatePickerDialog(this, showdate, fAno, fMes, fDia);
		}
		return null;
	}

	// método que captura la fecha y la hora del sistema
	@SuppressLint("SimpleDateFormat")
	public void fechaHoraSistema() {
		final Calendar c = Calendar.getInstance();
		int ano = c.get(Calendar.YEAR);
		int mes = c.get(Calendar.MONTH) + 1;
		int dia = c.get(Calendar.DAY_OF_MONTH);
		int hora = c.get(Calendar.HOUR_OF_DAY);
		int minuto = c.get(Calendar.MINUTE);

		SimpleDateFormat formatoFecha = new SimpleDateFormat("dd-MM-yyyy");
		SimpleDateFormat formatoTiempo = new SimpleDateFormat("hh:mm");
		String date = (dia + "-" + mes + "-" + ano + "-").toString();
		String time = (hora + ":" + minuto).toString();

		try {
			Time tiempo = new Time(formatoTiempo.parse(time).getTime());
			Date fecha = formatoFecha.parse(date);
			this.setFechaSistema(fecha);
			this.setTiempoSistema(tiempo);

		} catch (java.text.ParseException e) {

			manejadorMensajes.alertMessageOneButton(activity,
					R.string.tituloError, R.string.msjERFechaHoraSistema,
					R.string.btnAceptar);

		}
	}

	// metodo para registrar el PH Y Cloro
	public void registrarPhCl(View v) {
		int identificacion = manejador.identificacion(etIdPhClLb);
		int contrasena = manejador.contrasena(etPasswPhClLb);
		int cloro = manejador.valoresEnteros(etCloroPhClLb);
		int ph = manejador.validarPh(etPh);

		if (cloro != 0) {
			switch (cloro) {
			case 13:
				manejadorMensajes.alertMessageOneButton(activity,
						R.string.tituloAlerta, R.string.msjCloroVacio,
						R.string.btnAceptar);
				break;
			case 14:
				manejadorMensajes.alertMessageOneButton(activity,
						R.string.tituloAlerta, R.string.msjCloroEspac,
						R.string.btnAceptar);
				break;
			case 15:
				manejadorMensajes.alertMessageOneButton(activity,
						R.string.tituloAlerta, R.string.msjCloroLetras,
						R.string.btnAceptar);
				break;
			}
		} else {
			if (ph != 0) {
				switch (ph) {
				case 17:
					manejadorMensajes.alertMessageOneButton(activity,
							R.string.tituloAlerta, R.string.msjPhVacio,
							R.string.btnAceptar);
					break;
				case 18:
					manejadorMensajes.alertMessageOneButton(activity,
							R.string.tituloAlerta, R.string.msjPhEspac,
							R.string.btnAceptar);
					break;
				case 19:
					manejadorMensajes.alertMessageOneButton(activity,
							R.string.tituloAlerta, R.string.msjPhLetras,
							R.string.btnAceptar);
					break;
				}
			} else {
				if (identificacion != 0) {
					switch (identificacion) {
					case 8:
						manejadorMensajes.alertMessageOneButton(activity,
								R.string.tituloAlerta, R.string.msjIdenVacio,
								R.string.btnAceptar);
						break;
					case 9:
						manejadorMensajes.alertMessageOneButton(activity,
								R.string.tituloAlerta, R.string.msjIdenNumer,
								R.string.btnAceptar);

						break;

					case 10:
						manejadorMensajes.alertMessageOneButton(activity,
								R.string.tituloAlerta, R.string.msjIdenEspac,
								R.string.btnAceptar);
						break;
					}
				} else {
					if (contrasena != 0) {
						switch (contrasena) {
						case 11:
							manejadorMensajes.alertMessageOneButton(activity,
									R.string.tituloAlerta,
									R.string.msjContraVacio,
									R.string.btnAceptar);
							break;
						case 12:
							manejadorMensajes.alertMessageOneButton(activity,
									R.string.tituloAlerta,
									R.string.msjContraMaxmin,
									R.string.btnAceptar);
							break;
						}
					} else {
						this.validar();
					}
				}
			}

		}
	}

	public void validar() {
		this.fechaHoraSistema();
		if (this.getFechaSistema() != null && this.getTiempoSistema() != null) {
			if (this.getFechaUsuario() != null) {
				if (this.getTiempoUsuario() != null) {

					this.setIdEmpleado(etIdPhClLb.getText().toString());
					this.setPasswEmpleado(etPasswPhClLb.getText().toString());
					this.setPh(Integer.parseInt(etPh.getText().toString()));
					this.setCloro(Integer.parseInt(etCloroPhClLb.getText()
							.toString()));
					if (!this.etObsRegMP.getText().equals(STRING_EMPTY)) {

						this.setObservaciones(this.etObsRegMP.getText()
								.toString());
					}

					/* hilo que llama el metodo de validar usuario */
					new Thread(new Runnable() {
						@Override
						public void run() {
							self.validarUsuario();
							Log.e("ServicioRest", "entra validar usuario");

						}
					}).start();

				} else {
					manejadorMensajes.alertMessageOneButton(activity,
							R.string.tituloAlerta, R.string.msjSelecHora,
							R.string.btnAceptar);
				}
			} else {
				manejadorMensajes.alertMessageOneButton(activity,
						R.string.tituloAlerta, R.string.msjSelecFecha,
						R.string.btnAceptar);
			}
		}
	}

	// metodo que lo redirecciona a la vista pre-producción
	public void goPreProd(View view) {

		if (this.salir()) {

			new AlertDialog.Builder(this)
					.setIcon(android.R.drawable.ic_dialog_alert)
					.setTitle(R.string.tituloAlerta)
					.setMessage(R.string.msjPregunta)
					.setNegativeButton(R.string.btnNo, null)// sin listener
					.setPositiveButton(R.string.btnSi,
							new DialogInterface.OnClickListener() {// un
								// listener que al pulsar, cierre la
								// aplicacinn
								@Override
								public void onClick(DialogInterface dialog,
										int which) {
									// Salir
									Intent intent = new Intent();
									intent.setClass(activity,
											PreProduccion.class);
									startActivity(intent);
								}
							}).show();

			// Si el listener devuelve true, significa que el evento esta
			// procesado, y nadie debe hacer nada mas

		} else {
			Intent intent = new Intent();
			intent.setClass(this, PreProduccion.class);
			startActivity(intent);
		}

	}

	// valida si los campos de usuario estan vacios
	public void validarUsuario() {

		String ced = this.getIdEmpleado();
		String pass = this.getPasswEmpleado();
		HttpClient httpClient = new DefaultHttpClient();
		HttpPost post = new HttpPost(URL_VALIDAR_USUARIO);// operarios
		post.setHeader("content-type", "application/json");

		try {

			// Construimos el objeto en formato JSON
			JSONObject dato = new JSONObject();
			dato.put("cedula", ced);// cedula del operario
			dato.put("password", pass);// contrasena del operario
			dato.put("formulario", "f_ph_cl");// permisos

			StringEntity entity = new StringEntity(dato.toString());
			post.setEntity(entity);
			HttpResponse resp = httpClient.execute(post);
			this.setIdOperarioEmpleado(EntityUtils.toString(resp.getEntity()));

			if (this.getIdOperarioEmpleado().equals(CNV)) {
				runOnUiThread(new Runnable() {
					public void run() {
						manejadorMensajes.alertMessageOneButton(activity,
								R.string.tituloAlerta,
								R.string.msjCedulaIncorrecta,
								R.string.btnAceptar);

					}
				});

			} else {
				if (this.getIdOperarioEmpleado().equals(PNV)) {
					runOnUiThread(new Runnable() {
						public void run() {
							manejadorMensajes.alertMessageOneButton(activity,
									R.string.tituloAlerta,
									R.string.msjPasswordIncorrecta,
									R.string.btnAceptar);

						}
					});

				} else {

					if (this.getIdOperarioEmpleado().equals(no_permiso)) {
						runOnUiThread(new Runnable() {
							public void run() {
								manejadorMensajes.alertMessageOneButton(
										activity, R.string.tituloAlerta,
										R.string.msjSinPermisos,
										R.string.btnAceptar);

							}
						});
					} else {

						new Thread(new Runnable() {
							@Override
							public void run() {
								self.envioBaseDatos();
								Log.e("ServicioRest", "entra envio basedatos");

							}
						}).start();
					}

				}

			}

		} catch (Exception ex) {
			runOnUiThread(new Runnable() {
				public void run() {
					manejadorMensajes.alertMessageOneButton(activity,
							R.string.tituloError, R.string.msjERvalidarUsuario,
							R.string.btnAceptar);

				}
			});

		}

	}

	public void envioBaseDatos() {

		HttpClient httpClient = new DefaultHttpClient();
		// URL del servidor para guardar los datos de inmersion utensilios
		HttpPost post = new HttpPost(URL_REGISTROS_PH_CLORO);

		try {
			// Construimos el objeto cliente en formato JSON
			JSONObject dato = new JSONObject();

			// se almacenan los datos capturados por los campos de texto en
			// el objeto JSON para enviarlo al servidor.
			dato.put("empleado_id",
					Integer.parseInt(this.getIdOperarioEmpleado()));
			dato.put("observaciones", this.getObservaciones());
			dato.put("registro_cloro", this.getCloro());
			dato.put("registro_ph", this.getPh());
			dato.put("fecha_usuario", this.getFechaUsuario());
			dato.put("fecha_sistema", this.getFechaSistema());
			dato.put("hora_usuario", this.getTiempoUsuario());
			dato.put("hora_sistema", this.getTiempoSistema());

			StringEntity entity = new StringEntity(dato.toString());
			post.setHeader("Content-Type", "application/json; chartset=UTF-8");
			post.setHeader("Accept", "application/json");
			post.setEntity(entity);
			HttpResponse resp = httpClient.execute(post);
			final String respStr = EntityUtils.toString(resp.getEntity());
			Log.e("ServicioRest", entity.toString());

			if (respStr.equals("true")) {
				Log.e("ServicioRest", "el servidor me retorna true");
				this.setIdOperarioEmpleado(null);
				this.setFechaUsuario(null);
				this.setTiempoUsuario(null);
				this.setFechaSistema(null);
				this.setTiempoUsuario(null);
				this.setCloro(0);
				this.setPh(0);
				this.setObservaciones(null);

				Log.e("ServicioRest", "esta antes del hilo de msj exitoso");
				// mensaje de respuesta del servidor
				runOnUiThread(new Runnable() {
					public void run() {
						manejadorMensajes.alertMessageOneButton(activity,
								R.string.msjMuyBien,
								R.string.msjRegistroExitoso,
								R.string.btnAceptar);
						Log.e("ServicioRest",
								"el servidor me retorna true y esta en el mensaje exitoso");

					}
				});

				this.setSALIR(false);
			} else {
				runOnUiThread(new Runnable() {
					public void run() {

						AlertDialog.Builder mensajeEmergente = new AlertDialog.Builder(
								activity);
						mensajeEmergente.setTitle(R.string.tituloError);
						mensajeEmergente.setMessage(respStr);
						mensajeEmergente.setNeutralButton(R.string.btnAceptar,
								new DialogInterface.OnClickListener() {

									public void onClick(DialogInterface dialog,
											int which) {

									}
								});

						mensajeEmergente.create();
						mensajeEmergente.show();
						Log.e("ServicioRest",
								"el servidor me retorna true y esta en el mensaje en pantalla no exitoso");
					}
				});
			}

		} catch (Exception ex) {
			Log.e("ServicioRest", "me salta al catch");
			// mensaje de respuesta del servidor
			runOnUiThread(new Runnable() {
				public void run() {
					manejadorMensajes.alertMessageOneButton(activity,
							R.string.tituloError, R.string.msjERConexionEnviar,
							R.string.btnAceptar);

				}
			});

		}

	}

	/* metodo que controla el boton atras */
	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {

		if (keyCode == KeyEvent.KEYCODE_BACK) {
			if (this.salir()) {

				new AlertDialog.Builder(this)
						.setIcon(android.R.drawable.ic_dialog_alert)
						.setTitle(R.string.tituloAlerta)
						.setMessage(R.string.msjPregunta)
						.setNegativeButton(R.string.btnNo, null)// sin listener
						.setPositiveButton(R.string.btnSi,
								new DialogInterface.OnClickListener() {// un
									// listener que al pulsar, cierre la
									// aplicacion
									@Override
									public void onClick(DialogInterface dialog,
											int which) {
										// Salir
										PhCloroLibre.this.finish();
									}
								}).show();

				// Si el listener devuelve true, significa que el evento esta
				// procesado, y nadie debe hacer nada mas
				return true;
			} else {
				PhCloroLibre.this.finish();
			}
		}
		// para las demas cosas, se reenvia el evento al listener habitual
		return super.onKeyDown(keyCode, event);
	}

	/* verifica si no hay ningun dato en memoria ni en campos */
	public boolean salir() {

		if (this.isSALIR()) {
			return true;
		} else {
			return false;
		}

	}
}
